"""
该模块用于将文章管理软件导出的Refworks格式文件（筛选后）转换为CNKI导出的Refworks格式文件。

主要功能包括：
1. 读取文件内容。
2. 查找文件中的标题。
3. 统计标题出现的次数。
4. 移除重复记录和不在两个文件中的记录。
5. 将转换后的内容写入新文件。

模块中的主要类和函数：
- RefworksToRefworksConverter: 用于转换Refworks格式文件的类。
  - read_content: 读取文件内容。
  - write_content: 将内容写入文件。
  - find_titles: 查找内容中的标题。
  - count_titles: 统计标题出现的次数。
  - remove_differences_and_duplicates_records: 移除重复记录和不在两个文件中的记录。
  - convert: 转换文件并将结果写入新文件。
- main: 主函数，执行转换操作。
"""

import re


class RefworksToRefworksConverter:
    """
    用于将文章管理软件导出的Refworks格式文件转换为CNKI导出的Refworks格式文件的类。

    属性:
        content1 (str): 第一个文件的内容。
        content2 (str): 第二个文件的内容。
        titles1 (list): 在第一个文件中找到的标题。
        titles2 (list): 在第二个文件中找到的标题。
        unique_titles (set): 在两个文件中找到的唯一标题。
        title_counts (dict): 包含第二个文件中每个标题计数的字典。
        articles (list): 在第二个文件中找到的文章。

    方法:
        read_content(file_path): 读取文件内容。
        write_content(file_path, content): 将内容写入文件。
        find_titles(content): 查找内容中的标题。
        count_titles(titles): 统计标题出现的次数。
        remove_differences_and_duplicates_records(): 移除重复记录和不在两个文件中的记录。
        convert(output_file_path): 转换文件并将结果写入新文件。
    """

    def __init__(self, file_path1, file_path2):
        """
        构造所有必要的属性。

        参数:
            file_path1 (str): 第一个文件的路径。
            file_path2 (str): 第二个文件的路径。
        """
        self.content1 = self.read_content(file_path1)
        self.content2 = self.read_content(file_path2)
        self.titles1 = self.find_titles(self.content1)
        self.titles2 = self.find_titles(self.content2)
        self.unique_titles = set(self.titles1).symmetric_difference(set(self.titles2))
        self.title_counts = self.count_titles(self.titles2)
        self.articles = self.content2.split("RT Journal Article")

    def read_content(self, file_path):
        """
        读取文件内容。

        参数:
            file_path (str): 文件路径。

        返回值:
            str: 文件内容。
        """
        with open(file_path, "r", encoding="utf-8") as file:
            return file.read()

    def write_content(self, file_path, content):
        """
        将内容写入文件。

        参数:
            file_path (str): 文件路径。
            content (str): 要写入的内容。
        """
        with open(file_path, "w", encoding="utf-8") as file:
            file.write(content)

    def find_titles(self, content):
        """
        查找内容中的标题。

        参数:
            content (str): 要搜索的内容。

        返回值:
            list: 找到的标题列表。
        """
        return re.findall(r"T1 (.*?)\n", content)

    def count_titles(self, titles):
        """
        统计标题出现的次数。

        参数:
            titles (list): 标题列表。

        返回值:
            dict: 包含每个标题计数的字典。
        """
        title_counts = {}
        for title in titles:
            title_counts[title] = title_counts.get(title, 0) + 1
        return title_counts

    def remove_differences_and_duplicates_records(self):
        """
        移除重复记录和不在两个文件中的记录。

        返回值:
            list: 移除重复和差异后的文章列表。
        """
        for i in range(len(self.articles) - 1, -1, -1):
            title = re.search(r"T1 (.*?)\n", self.articles[i])
            if (
                title
                and (title := title.group(1)) in self.unique_titles
                or self.title_counts.get(title, 1) > 1
            ):
                self.title_counts[title] -= 1
                del self.articles[i]
        return self.articles

    def convert(self, output_file_path):
        """
        转换文件并将结果写入新文件。

        参数:
            output_file_path (str): 输出文件路径。
        """
        self.remove_differences_and_duplicates_records()
        updated_entries = "RT Journal Article".join(self.articles)
        self.write_content(output_file_path, updated_entries)


def main():
    """
    主函数
    """
    article_management_export_file = r"[your_article_management_export_file_path]"
    cnki_database_export_file = r"[your_cnki_database_export_refworks_file_path]"
    converter = RefworksToRefworksConverter(
        article_management_export_file, cnki_database_export_file
    )

    # 输出文件路径
    output_file_path = "download_refworks_filtered_file.txt"
    converter.convert(output_file_path)

    print(f"Conversion completed. The output file path is {output_file_path}")


if __name__ == "__main__":
    main()
